package com.jinbao.springbootinit.manager;

import com.jinbao.springbootinit.exception.BusinessException;
import com.jinbao.springbootinit.common.ErrorCode;
import org.redisson.api.RRateLimiter;
import org.redisson.api.RateIntervalUnit;
import org.redisson.api.RateType;
import org.redisson.api.RedissonClient;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;

@Service
public class RedisLimiterManager {
    @Resource
    private RedissonClient redissonClient;

    /**
     * 限流操作
     * @param key  区分不同的限流器，比如用户id
     */

    public void doRateLimit(String key){
        //创建一个名称为user_limiter的限流器，每秒最多访问2次
        RRateLimiter rateLimiter=redissonClient.getRateLimiter(key);
        //限流器的统计规划（每秒2个请求，连续的请求，最多智能有一个请求被通过）
        //RateType.OVERALL表示速率限制作用鱼整个令牌桶，限制所有请求的速率
        rateLimiter.trySetRate(RateType.OVERALL,2,1, RateIntervalUnit.SECONDS);

        //每当一个操作来了后，请求一个令牌
        boolean canOp=rateLimiter.tryAcquire(1);
        if(!canOp){
            throw new BusinessException(ErrorCode.TOO_MANY_REQUEST);
        }



    }
}
